package cn.dcw.pethome.user.service.impl;

import cn.dcw.pethome.basic.exception.MyException;
import cn.dcw.pethome.basic.util.SendMsg;
import cn.dcw.pethome.basic.util.StrUtils;
import cn.dcw.pethome.user.domain.User;
import cn.dcw.pethome.user.mapper.UserMapper;
import cn.dcw.pethome.user.service.IUserVerifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;

import java.lang.annotation.ElementType;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 用户信息校验
 */
@Service
public class UserVerifyServiceImpl implements IUserVerifyService{

    @Autowired
    private UserMapper mapper;
    @Autowired
    private RedisTemplate redisTemplate;//注入redis对象

    /*
    核对该手机号是否在后台已经注册过
     */
    @Override
    public User findOneByPhone(String phone){
        //1.判断手机号是否为空
        /**
         * 判断某字符串是否为空，为空的标准是 str==null 或 str.length()==0
         StringUtils.isEmpty(null) = true
         StringUtils.isEmpty("") = true
         */
        if(StringUtils.isEmpty(phone)){
            throw new MyException("手机号不能为空***");
        }

        //2.通过客户输入的手机号 查询对象
        User user = mapper.findOneByPhone(phone);
        if(user==null){
            return user;
        }else {
            throw new MyException("该账户已注册，请直接登入***");
        }
    }

    /**
     * 校验手机验证码是否一致
     * @param phone
     */
    @Override
    public void verifycode(Map<String,String> map) {

        //获取手机号
        String phone = map.get("phone");
        //获取type（区分是什么功能发送的验证码）
        String type = map.get("type");

        //注册
        if(type.equals("register")){
            //判断手机号是否注册过（之前普通注册）
            User user = mapper.findOneByPhone(phone);
            if(user!=null){
                throw new MyException("该账户已注册，请直接登入***");
            }
            //调用方法生成验证码
            sendCode("register",phone);
        }else if(type.equals("binder")){//微信注册绑定
        //调用方法生成验证码
            sendCode("binder",phone);
        }


    }
    /**
     * 生成验证码
     */
    public void sendCode(String type,String phone){
        /**
         * redis   key  register（功能名称）+phone    value   code(验证码)+时间戳
         */
        //1.判断redis里面获取储存的验证码对象
        Object obj = redisTemplate.opsForValue().get(type+"-"+ phone);
        System.out.println(obj);
        //2.判断这个对象是否存在，如果存在，说明客户短时间内已经提交过一次获取验证码的请求
        String code="";
        if(obj!=null){//obj  value   code(验证码)+时间戳
            //将对象转换为字符串，在切割，得到一个数组
            String[] split = obj.toString().split("-");
            String time = split[1];//时间戳
            //3.如果有数据，在判断里面的验证嘛储存时间是否超过一分钟
            //Long.valueOf(time)将字符串转换为数字
            long l = System.currentTimeMillis() - Long.valueOf(time);
            if(l<1000*60){
                throw new MyException("一分钟后再操作***");
            }else {
                //如果超过一分钟，将原来的验证码，有效期时间再延长
                code = split[0];//之前的验证码
                redisTemplate.opsForValue().set(type+"-"+ phone,//key
                        code+"-"+System.currentTimeMillis(),//value
                        5, //时间
                        TimeUnit.MINUTES );//单位（分钟）
            }
        }else {//没有验证码，直接调用工具类生成随机验证码
            //4.随机生成6位数的验证码
            code = StrUtils.getComplexRandomString(6);
        }
        //5.将随机验证码设置到rides中
        redisTemplate.opsForValue().set(type+"-"+ phone,//key
                code+"-"+System.currentTimeMillis(),//value
                5, //时间
                TimeUnit.MINUTES );//单位（分钟）
        //6.发送短信
        //SendMsg.msmSend(phone, "您的短信验证码为: "+code+" ，5分钟内有效！");
        System.out.println(code);
    }
}
